package section4_9;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * Created by Hyman on 2017/6/8.
 *
 * 在执行器中取消任务
 *
 *
 * 如果想取消一个已经发送给执行器的任务，可以使用Future接口的Cancel()方法。 根据调用cancel()方法时所传递的参数以及任务的状态，这个方法的行为有些不同。

 * 　　如果任务已经完成，或者之前己经被取消，或者由于某种原因而不能被取消，那么方法将返回false并且任务也不能取消。

 * 　　如果任务在执行器中等待分配Thread对象来执行它，那么任务被取消，并且不会开始执行。如果任务已经在运行，那么它依赖于调用cancel()方法时所传递的参数。如果传递的参数为true并且任务正在运行，那么任务将被取消。如果传递的参数为false并且任务正在运行，那么任务不会被取消。

 * 　  如果Future对象所控制任务己经被取消，那么使用Future对象的get()方法时将抛出 CancellationException 异常。
 */
public class Main {

    public static void main(String[] args) {

        ExecutorService executorService = Executors.newCachedThreadPool();
        Task task = new Task();

        System.out.printf("Main: Executing the Task\n");
        // 把任务发送到执行器
        Future<String> result = executorService.submit(task);

        try {
            // 休眠两秒钟
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 取消一个任务完成他的执行
        System.out.printf("Main: Cancelling the Task\n");
        result.cancel(true);

        // 验证任务是否被取消
        System.out.printf("Main: Cancelled: %s\n", result.isCancelled());
        System.out.printf("Main: Done: %s\n", result.isDone());

        // 关闭执行器
        executorService.shutdown();
        System.out.printf("Main: The executor has finished\n");

    }

}
